package org.wheel.plugins.toolkit.sql.segment;

import cn.hutool.core.util.StrUtil;
import org.wheel.plugins.toolkit.sql.core.SqlSegment;
import org.wheel.plugins.toolkit.sql.helper.LambdaUtils;
import org.wheel.plugins.toolkit.sql.helper.SFunction;

/**
 * SELECT 列片段（函数、字段、子查询）
 * 因为多表关联时，字段别名无法延时找到表对应的别名，因此采用 ColumnRef 类进行字段查询处理
 * 当前类，仅作为数据返回对象使用，或者处理明确的别名使用
 */
public interface SelectSegment extends SqlSegment {
    // 已继承 getSql()
    /* 默认提供别名 */
    default SelectSegment as(String alias) {
        if(alias.contains(".") && !alias.contains("\"")){
            alias = "\"" + alias + "\"";
        } else {
            alias = alias.trim();
        }
        String finalAlias = alias;
        return () -> getSql() + " AS " + finalAlias;
    }

    /* ✅ Lambda 版本：自动解析属性名 → 列别名(驼峰规则) */
    default <T> SelectSegment as(SFunction<T, ?> aliasFn) {
        String alias = LambdaUtils.getFieldName(aliasFn);
        return as(alias);
    }
}